import javax.swing.tree.TreeNode;
import java.util.LinkedList;
import java.util.Queue;

/**
 * 117. 填充每个节点的下一个右侧节点指针 II
 * 中等
 * 相关标签
 * 相关企业
 * 给定一个二叉树：
 *
 * struct Node {
 *   int val;
 *   Node *left;
 *   Node *right;
 *   Node *next;
 * }
 * 填充它的每个 next 指针，让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点，则将 next 指针设置为 NULL 。
 *
 * 初始状态下，所有 next 指针都被设置为 NULL 。
 *
 *
 *
 * 示例 1：
 *
 *
 * 输入：root = [1,2,3,4,5,null,7]
 * 输出：[1,#,2,3,#,4,5,7,#]
 * 解释：给定二叉树如图 A 所示，你的函数应该填充它的每个 next 指针，以指向其下一个右侧节点，如图 B 所示。序列化输出按层序遍历顺序（由 next 指针连接），'#' 表示每层的末尾。
 * 示例 2：
 *
 * 输入：root = []
 * 输出：[]
 */
public class T117 {
    // 思路：树的层级遍历，用到队列
    public T117(Node root) {
//        Node node = new Node(2);
//        root.left = node;
//        Node node1 = new Node(3);
//        root.right = node1;
//        Node node2 = new Node(4);
//        node.left = node2;
//        Node node3 = new Node(5);
//        node.right = node3;
//        Node node4 = new Node(6);
//        node1.left = node4;
//        Node node5 = new Node(7);
//        node1.right = node5;

        levelOrderTraversal(root); // 按层遍历二叉树
        System.out.println(root);

    }

    public void levelOrderTraversal(Node root) {
        if (root == null) {
            return;
        }

        Queue<Node> queue = new LinkedList<>();
        queue.offer(root);

        while (!queue.isEmpty()) {
            int n = queue.size();
            for (int i = 0; i < n; i++) {
                Node node = queue.poll();

                node.next = queue.peek();

                if (node.left != null) {
                    queue.offer(node.left);
                }

                if (node.right != null) {
                    queue.offer(node.right);
                }
                if (i == n-1){
                    node.next = null;
                }
            }

        }
    }
}


    class Node {
    public int val;
    public Node left;
    public Node right;
    public Node next;

    public Node() {}

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, Node _left, Node _right, Node _next) {
        val = _val;
        left = _left;
        right = _right;
        next = _next;
    }
};
//            1
//    2              3
//4       5       6       7
//
//n = 3
//val.next = val+1
//val+1=null
//n=n-1
//val.next.left or val.next.right
